#include "gskngltypesprivate.h"
+#include "gsknglattachmentstateprivate.h"
#include "gsknglcommandqueueprivate.h"
#include "gskngldriverprivate.h"
G_BEGIN_DECLS
#define GSK_TYPE_GL_PROGRAM (gsk_ngl_program_get_type())
+#define GSK_NGL_PROGRAM_MAX_CUSTOM_TEXTURES 4
+#define GSK_NGL_PROGRAM_MAX_CUSTOM_ARGS 8
G_DECLARE_FINAL_TYPE (GskNglProgram, gsk_ngl_program, GSK, NGL_PROGRAM, GObject)
char *name;
GskNglDriver *driver;
- /* In reality, this is the largest uniform position
- * as returned after linking so that we can use direct
- * indexes based on location.
- */
- guint n_uniforms;
-
/* Cached pointer to avoid lots of pointer chasing/lookups */
GskNglUniformState *uniforms;
GskNglUniformProgram *program_info;
- /* For custom programs */
- int texture_locations[4];
- int args_locations[8];
- int size_location;
-
/* Static array for key->location transforms */
- int uniform_locations[32];
+ GskNglUniformMapping mappings[32];
+ guint n_mappings;
};
GskNglProgram *gsk_ngl_program_new (GskNglDriver *driver,
gboolean has_attachments);
void gsk_ngl_program_delete (GskNglProgram *self);
-#define gsk_ngl_program_get_uniform_location(s,k) ((s)->uniform_locations[(k)])
-
static inline void
gsk_ngl_program_set_uniform1fv (GskNglProgram *self,
guint key,
const float *values)
{
gsk_ngl_uniform_state_set1fv (self->uniforms, self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, count, values);
+ key,
+ stamp,
+ count,
+ values);
}
static inline void
const float *values)
{
gsk_ngl_uniform_state_set2fv (self->uniforms, self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, count, values);
+ key,
+ stamp,
+ count,
+ values);
}
static inline void
const float *values)
{
gsk_ngl_uniform_state_set4fv (self->uniforms, self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, count, values);
+ key,
+ stamp,
+ count,
+ values);
}
static inline void
const GskRoundedRect *rounded_rect)
{
gsk_ngl_uniform_state_set_rounded_rect (self->uniforms, self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, rounded_rect);
+ key,
+ stamp,
+ rounded_rect);
}
static inline void
{
gsk_ngl_uniform_state_set1i (self->uniforms,
self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, value0);
+ key,
+ stamp,
+ value0);
}
static inline void
{
gsk_ngl_uniform_state_set2i (self->uniforms,
self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, value0, value1);
+ key,
+ stamp,
+ value0, value1);
}
static inline void
{
gsk_ngl_uniform_state_set3i (self->uniforms,
self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, value0, value1, value2);
+ key,
+ stamp,
+ value0, value1, value2);
}
static inline void
{
gsk_ngl_uniform_state_set4i (self->uniforms,
self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, value0, value1, value2, value3);
+ key,
+ stamp,
+ value0, value1, value2, value3);
}
static inline void
{
gsk_ngl_uniform_state_set1f (self->uniforms,
self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, value0);
+ key,
+ stamp,
+ value0);
}
static inline void
{
gsk_ngl_uniform_state_set2f (self->uniforms,
self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, value0, value1);
+ key,
+ stamp,
+ value0, value1);
}
static inline void
{
gsk_ngl_uniform_state_set3f (self->uniforms,
self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, value0, value1, value2);
+ key,
+ stamp,
+ value0, value1, value2);
}
static inline void
{
gsk_ngl_uniform_state_set4f (self->uniforms,
self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, value0, value1, value2, value3);
+ key,
+ stamp,
+ value0, value1, value2, value3);
}
static inline void
{
gsk_ngl_uniform_state_set_color (self->uniforms,
self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, color);
+ key,
+ stamp,
+ color);
}
static inline void
texture_id);
gsk_ngl_uniform_state_set_texture (self->uniforms,
self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, texture_slot);
+ key,
+ stamp,
+ texture_slot);
}
static inline void
{
gsk_ngl_uniform_state_set_matrix (self->uniforms,
self->program_info,
- gsk_ngl_program_get_uniform_location (self, key),
- stamp, matrix);
+ key,
+ stamp,
+ matrix);
}
G_END_DECLS
job->viewport.size.width,
job->viewport.size.height);
- if (program->uniform_locations[UNIFORM_SHARED_VIEWPORT] > -1)
- gsk_ngl_uniform_state_set4fv (program->uniforms,
- program->program_info,
- program->uniform_locations[UNIFORM_SHARED_VIEWPORT],
- job->driver->stamps[UNIFORM_SHARED_VIEWPORT],
- 1,
- (const float *)&job->viewport);
-
- if (program->uniform_locations[UNIFORM_SHARED_MODELVIEW] > -1)
- gsk_ngl_uniform_state_set_matrix (program->uniforms,
- program->program_info,
- program->uniform_locations[UNIFORM_SHARED_MODELVIEW],
- job->driver->stamps[UNIFORM_SHARED_MODELVIEW],
- &job->current_modelview->matrix);
-
- if (program->uniform_locations[UNIFORM_SHARED_PROJECTION] > -1)
- gsk_ngl_uniform_state_set_matrix (program->uniforms,
- program->program_info,
- program->uniform_locations[UNIFORM_SHARED_PROJECTION],
- job->driver->stamps[UNIFORM_SHARED_PROJECTION],
- &job->projection);
-
- if (program->uniform_locations[UNIFORM_SHARED_CLIP_RECT] > -1)
- gsk_ngl_uniform_state_set_rounded_rect (program->uniforms,
- program->program_info,
- program->uniform_locations[UNIFORM_SHARED_CLIP_RECT],
- job->driver->stamps[UNIFORM_SHARED_CLIP_RECT],
- &job->current_clip->rect);
+ gsk_ngl_uniform_state_set4fv (program->uniforms,
+ program->program_info,
+ UNIFORM_SHARED_VIEWPORT,
+ job->driver->stamps[UNIFORM_SHARED_VIEWPORT],
+ 1,
+ (const float *)&job->viewport);
+
+ gsk_ngl_uniform_state_set_matrix (program->uniforms,
+ program->program_info,
+ UNIFORM_SHARED_MODELVIEW,
+ job->driver->stamps[UNIFORM_SHARED_MODELVIEW],
+ &job->current_modelview->matrix);
- if (program->uniform_locations[UNIFORM_SHARED_ALPHA] > -1)
- gsk_ngl_uniform_state_set1f (program->uniforms,
- program->program_info,
- program->uniform_locations[UNIFORM_SHARED_ALPHA],
- job->driver->stamps[UNIFORM_SHARED_ALPHA],
- job->alpha);
+ gsk_ngl_uniform_state_set_matrix (program->uniforms,
+ program->program_info,
+ UNIFORM_SHARED_PROJECTION,
+ job->driver->stamps[UNIFORM_SHARED_PROJECTION],
+ &job->projection);
+
+ gsk_ngl_uniform_state_set_rounded_rect (program->uniforms,
+ program->program_info,
+ UNIFORM_SHARED_CLIP_RECT,
+ job->driver->stamps[UNIFORM_SHARED_CLIP_RECT],
+ &job->current_clip->rect);
+
+ gsk_ngl_uniform_state_set1f (program->uniforms,
+ program->program_info,
+ UNIFORM_SHARED_ALPHA,
+ job->driver->stamps[UNIFORM_SHARED_ALPHA],
+ job->alpha);
}
#define CHOOSE_PROGRAM(job,name) \
const GskGLUniform *u = &uniforms[i];
const guint8 *data = base + u->offset;
- /* Ignore unused uniforms */
- if (program->args_locations[i] == -1)
- continue;
-
switch (u->type)
{
default:
case GSK_GL_UNIFORM_TYPE_FLOAT:
gsk_ngl_uniform_state_set1fv (job->command_queue->uniforms,
program->program_info,
- program->args_locations[i],
+ UNIFORM_CUSTOM_ARG0 + i,
0, 1, (const float *)data);
break;
case GSK_GL_UNIFORM_TYPE_INT:
gsk_ngl_uniform_state_set1i (job->command_queue->uniforms,
program->program_info,
- program->args_locations[i],
+ UNIFORM_CUSTOM_ARG0 + i,
0, *(const gint32 *)data);
break;
case GSK_GL_UNIFORM_TYPE_UINT:
case GSK_GL_UNIFORM_TYPE_BOOL:
gsk_ngl_uniform_state_set1ui (job->command_queue->uniforms,
program->program_info,
- program->args_locations[i],
+ UNIFORM_CUSTOM_ARG0 + i,
0, *(const guint32 *)data);
break;
case GSK_GL_UNIFORM_TYPE_VEC2:
gsk_ngl_uniform_state_set2fv (job->command_queue->uniforms,
program->program_info,
- program->args_locations[i],
+ UNIFORM_CUSTOM_ARG0 + i,
0, 1, (const float *)data);
break;
case GSK_GL_UNIFORM_TYPE_VEC3:
gsk_ngl_uniform_state_set3fv (job->command_queue->uniforms,
program->program_info,
- program->args_locations[i],
+ UNIFORM_CUSTOM_ARG0 + i,
0, 1, (const float *)data);
break;
case GSK_GL_UNIFORM_TYPE_VEC4:
gsk_ngl_uniform_state_set4fv (job->command_queue->uniforms,
program->program_info,
- program->args_locations[i],
+ UNIFORM_CUSTOM_ARG0 + i,
0, 1, (const float *)data);
break;
}
}
gpointer
-gsk_ngl_uniform_state_init_value (GskNglUniformState *state,
- GskNglUniformProgram *program,
- GskNglUniformFormat format,
- guint array_count,
- guint location,
- GskNglUniformInfoElement **infoptr)
+gsk_ngl_uniform_state_init_value (GskNglUniformState *state,
+ GskNglUniformProgram *program,
+ GskNglUniformFormat format,
+ guint array_count,
+ guint key,
+ GskNglUniformMapping **infoptr)
{
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *mapping;
guint offset;
g_assert (state != NULL);
g_assert ((int)format >= 0 && format < GSK_NGL_UNIFORM_FORMAT_LAST);
g_assert (format > 0);
g_assert (program != NULL);
- g_assert (program->sparse != NULL);
- g_assert (program->n_sparse <= program->n_uniforms);
- g_assert (location < GL_MAX_UNIFORM_LOCATIONS || location == (guint)-1);
- g_assert (location < program->n_uniforms);
+ g_assert (key < program->n_mappings);
- /* Handle unused uniforms gracefully */
- if G_UNLIKELY (location == (guint)-1)
- return NULL;
+ mapping = &program->mappings[key];
- info = &program->uniforms[location];
+ if (mapping->location == -1)
+ {
+ *infoptr = NULL;
+ return NULL;
+ }
- if G_LIKELY (format == info->info.format)
+ if G_LIKELY (format == mapping->info.format)
{
- if G_LIKELY (array_count <= info->info.array_count)
+ if G_LIKELY (array_count <= mapping->info.array_count)
{
- *infoptr = info;
- return GSK_NGL_UNIFORM_VALUE (state->values_buf, info->info.offset);
+ *infoptr = mapping;
+ return GSK_NGL_UNIFORM_VALUE (state->values_buf, mapping->info.offset);
}
/* We found the uniform, but there is not enough space for the
*/
goto setup_info;
}
- else if (info->info.format == 0)
+ else if (mapping->info.format == 0)
{
goto setup_info;
}
g_critical ("Attempt to access uniform with different type of value "
"than it was initialized with. Program %u Location %u. "
"Was %d now %d (array length %d now %d).",
- program->program_id, location, info->info.format, format,
- info->info.array_count, array_count);
+ program->program_id, key, mapping->info.format, format,
+ mapping->info.array_count, array_count);
*infoptr = NULL;
return NULL;
}
/* we have 21 bits for offset */
g_assert (offset < (1 << GSK_NGL_UNIFORM_OFFSET_BITS));
- /* We could once again be setting up this info if the array size grew.
- * So make sure that we have space in our space array for the value.
- */
- g_assert (info->info.format != 0 || program->n_sparse < program->n_uniforms);
- if (info->info.format == 0)
- program->sparse[program->n_sparse++] = location;
-
- info->info.format = format;
- info->info.offset = offset;
- info->info.array_count = array_count;
- info->info.initial = TRUE;
- info->stamp = 0;
+ mapping->info.format = format;
+ mapping->info.offset = offset;
+ mapping->info.array_count = array_count;
+ mapping->info.initial = TRUE;
+ mapping->stamp = 0;
- *infoptr = info;
+ *infoptr = mapping;
- return GSK_NGL_UNIFORM_VALUE (state->values_buf, info->info.offset);
+ return GSK_NGL_UNIFORM_VALUE (state->values_buf, mapping->info.offset);
}
void
g_hash_table_iter_init (&iter, state->programs);
while (g_hash_table_iter_next (&iter, NULL, (gpointer *)&program))
{
- for (guint j = 0; j < program->n_sparse; j++)
+ for (guint j = 0; j < program->n_mappings; j++)
{
- guint location = program->sparse[j];
- GskNglUniformInfoElement *info = &program->uniforms[location];
+ GskNglUniformMapping *mapping = &program->mappings[j];
guint size;
- g_assert (info->info.format > 0);
+ /* Skip unused uniform mappings */
+ if (mapping->info.format == 0 || mapping->location == -1)
+ continue;
/* Calculate how much size is needed for the uniform, including arrays */
- size = uniform_sizes[info->info.format] * MAX (1, info->info.array_count);
+ size = uniform_sizes[mapping->info.format] * MAX (1, mapping->info.array_count);
/* Adjust alignment for value */
allocator += gsk_ngl_uniform_state_align (allocator, size);
/* Offset is in slots of 4 bytes */
- info->info.offset = allocator / 4;
- info->info.initial = TRUE;
- info->stamp = 0;
+ mapping->info.offset = allocator / 4;
+ mapping->info.initial = TRUE;
+ mapping->stamp = 0;
/* Now advance for this items data */
allocator += size;
}
GskNglUniformProgram *
-gsk_ngl_uniform_state_get_program (GskNglUniformState *state,
- guint program,
- guint n_uniforms)
+gsk_ngl_uniform_state_get_program (GskNglUniformState *state,
+ guint program,
+ const GskNglUniformMapping *mappings,
+ guint n_mappings)
{
GskNglUniformProgram *ret;
g_return_val_if_fail (state != NULL, NULL);
g_return_val_if_fail (program > 0, NULL);
g_return_val_if_fail (program < G_MAXUINT, NULL);
+ g_return_val_if_fail (n_mappings <= G_N_ELEMENTS (ret->mappings), NULL);
ret = g_hash_table_lookup (state->programs, GUINT_TO_POINTER (program));
if (ret == NULL)
{
- gsize uniform_size = n_uniforms * sizeof (GskNglUniformInfoElement);
- gsize sparse_size = n_uniforms * sizeof (guint);
- gsize size = sizeof (GskNglUniformProgram) + uniform_size + sparse_size;
-
- /* Must be multiple of 4 for space pointer to align */
- G_STATIC_ASSERT (sizeof (GskNglUniformInfoElement) == 8);
-
- ret = g_malloc0 (size);
+ ret = g_new0 (GskNglUniformProgram, 1);
ret->program_id = program;
- ret->n_uniforms = n_uniforms;
- ret->n_sparse = 0;
- ret->sparse = (guint *)&ret->uniforms[n_uniforms];
+ ret->n_mappings = n_mappings;
- for (guint i = 0; i < n_uniforms; i++)
- ret->uniforms[i].info.initial = TRUE;
+ memcpy (ret->mappings, mappings, n_mappings * sizeof *mappings);
g_hash_table_insert (state->programs, GUINT_TO_POINTER (program), ret);
}
G_STATIC_ASSERT (sizeof (GskNglUniformInfo) == 4);
-typedef struct _GskNglUniformInfoElement
+typedef struct _GskNglUniformMapping
{
+ const char *name;
GskNglUniformInfo info;
guint stamp;
-} GskNglUniformInfoElement;
-
-G_STATIC_ASSERT (sizeof (GskNglUniformInfoElement) == 8);
+ int location;
+} GskNglUniformMapping;
typedef struct _GskNglUniformProgram
{
guint program_id;
guint n_uniforms : 12;
guint has_attachments : 1;
-
- /* To avoid walking our 1:1 array of location->uniform slots, we have
- * a sparse index that allows us to skip the empty zones.
- */
- guint *sparse;
- guint n_sparse;
-
- /* Uniforms are provided inline at the end of structure to avoid
- * an extra dereference.
- */
- GskNglUniformInfoElement uniforms[0];
+ guint n_mappings;
+ GskNglUniformMapping mappings[32];
} GskNglUniformProgram;
typedef struct _GskNglUniformState
GskNglUniformInfo apply_hash[512];
} GskNglUniformState;
-/**
- * GskNglUniformStateCallback:
- * @info: a pointer to the information about the uniform
- * @location: the location of the uniform within the GPU program.
- * @user_data: closure data for the callback
- *
- * This callback can be used to snapshot state of a program which
- * is useful when batching commands so that the state may be compared
- * with future evocations of the program.
- */
-typedef void (*GskNglUniformStateCallback) (const GskNglUniformInfo *info,
- guint location,
- gpointer user_data);
-
typedef enum _GskNglUniformKind
{
GSK_NGL_UNIFORM_FORMAT_1F = 1,
G_STATIC_ASSERT (GSK_NGL_UNIFORM_FORMAT_LAST < (1 << GSK_NGL_UNIFORM_FORMAT_BITS));
GskNglUniformState *gsk_ngl_uniform_state_new (void);
-GskNglUniformState *gsk_ngl_uniform_state_ref (GskNglUniformState *state);
-void gsk_ngl_uniform_state_unref (GskNglUniformState *state);
-GskNglUniformProgram *gsk_ngl_uniform_state_get_program (GskNglUniformState *state,
- guint program,
- guint n_uniforms);
-void gsk_ngl_uniform_state_end_frame (GskNglUniformState *state);
-gsize gsk_ngl_uniform_format_size (GskNglUniformFormat format);
-gpointer gsk_ngl_uniform_state_init_value (GskNglUniformState *state,
- GskNglUniformProgram *program,
- GskNglUniformFormat format,
- guint array_count,
- guint location,
- GskNglUniformInfoElement **infoptr);
+GskNglUniformState *gsk_ngl_uniform_state_ref (GskNglUniformState *state);
+void gsk_ngl_uniform_state_unref (GskNglUniformState *state);
+GskNglUniformProgram *gsk_ngl_uniform_state_get_program (GskNglUniformState *state,
+ guint program,
+ const GskNglUniformMapping *mappings,
+ guint n_mappings);
+void gsk_ngl_uniform_state_end_frame (GskNglUniformState *state);
+gsize gsk_ngl_uniform_format_size (GskNglUniformFormat format);
+gpointer gsk_ngl_uniform_state_init_value (GskNglUniformState *state,
+ GskNglUniformProgram *program,
+ GskNglUniformFormat format,
+ guint array_count,
+ guint key,
+ GskNglUniformMapping **out_mapping);
#define GSK_NGL_UNIFORM_VALUE(base, offset) ((gpointer)((base) + ((offset) * 4)))
#define gsk_ngl_uniform_state_get_uniform_data(state,offset) GSK_NGL_UNIFORM_VALUE((state)->values_buf, offset)
-#define gsk_ngl_uniform_state_snapshot(state, program_info, callback, user_data) \
- G_STMT_START { \
- for (guint z = 0; z < program_info->n_sparse; z++) \
- { \
- guint location = program_info->sparse[z]; \
- GskNglUniformInfoElement *info = &program_info->uniforms[location]; \
- \
- g_assert (location < GL_MAX_UNIFORM_LOCATIONS); \
- g_assert (location < program_info->n_uniforms); \
- \
- if (info->info.format > 0) \
- callback (&info->info, location, user_data); \
- } \
- } G_STMT_END
static inline gpointer
-gsk_ngl_uniform_state_get_value (GskNglUniformState *state,
- GskNglUniformProgram *program,
- GskNglUniformFormat format,
- guint array_count,
- guint location,
- guint stamp,
- GskNglUniformInfoElement **infoptr)
+gsk_ngl_uniform_state_get_value (GskNglUniformState *state,
+ GskNglUniformProgram *program,
+ GskNglUniformFormat format,
+ guint array_count,
+ guint key,
+ guint stamp,
+ GskNglUniformMapping **out_mapping)
{
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *mapping;
+
+ g_assert (key < G_N_ELEMENTS (program->mappings));
+ g_assert (key < program->n_mappings);
+
+ mapping = &program->mappings[key];
- if (location == (guint)-1)
+ /* Short-circuit if the program optimized the uniform out */
+ if (mapping->location == -1)
return NULL;
/* If the stamp is the same, then we can ignore the request
* modelview, clip, etc to avoid so many comparisons which cost
* considerable CPU.
*/
- info = &program->uniforms[location];
- if (stamp != 0 && stamp == info->stamp)
+ if (stamp != 0 && stamp == mapping->stamp)
return NULL;
- if G_LIKELY (format == info->info.format && array_count <= info->info.array_count)
+ if G_LIKELY (format == mapping->info.format && array_count <= mapping->info.array_count)
{
- *infoptr = info;
- return GSK_NGL_UNIFORM_VALUE (state->values_buf, info->info.offset);
+ *out_mapping = mapping;
+ return GSK_NGL_UNIFORM_VALUE (state->values_buf, mapping->info.offset);
}
- return gsk_ngl_uniform_state_init_value (state, program, format, array_count, location, infoptr);
+ return gsk_ngl_uniform_state_init_value (state, program, format, array_count, key, out_mapping);
}
static inline guint
} G_STMT_END
static inline void
-gsk_ngl_uniform_info_changed (GskNglUniformInfoElement *info,
- guint location,
+gsk_ngl_uniform_info_changed (GskNglUniformMapping *info,
guint stamp)
{
info->stamp = stamp;
static inline void
gsk_ngl_uniform_state_set1f (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
float value0)
{
Uniform1f *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != 0);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1F, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1F, 1, key, stamp, &info)))
{
if (info->info.initial || u->v0 != value0)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform1f , 1);
u->v0 = value0;
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set2f (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
float value0,
float value1)
{
Uniform2f *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2F, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2F, 1, key, stamp, &info)))
{
if (info->info.initial || u->v0 != value0 || u->v1 != value1)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform2f, 1);
u->v0 = value0;
u->v1 = value1;
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set3f (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
float value0,
float value1,
float value2)
{
Uniform3f *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3F, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3F, 1, key, stamp, &info)))
{
if (info->info.initial || u->v0 != value0 || u->v1 != value1 || u->v2 != value2)
{
u->v0 = value0;
u->v1 = value1;
u->v2 = value2;
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set4f (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
float value0,
float value1,
float value3)
{
Uniform4f *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4F, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4F, 1, key, stamp, &info)))
{
if (info->info.initial || u->v0 != value0 || u->v1 != value1 || u->v2 != value2 || u->v3 != value3)
{
u->v1 = value1;
u->v2 = value2;
u->v3 = value3;
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set1ui (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
guint value0)
{
Uniform1ui *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1UI, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1UI, 1, key, stamp, &info)))
{
if (info->info.initial || u->v0 != value0)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform1ui, 1);
u->v0 = value0;
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set1i (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
int value0)
{
Uniform1i *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1I, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1I, 1, key, stamp, &info)))
{
if (info->info.initial || u->v0 != value0)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform1i, 1);
u->v0 = value0;
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set2i (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
int value0,
int value1)
{
Uniform2i *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2I, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2I, 1, key, stamp, &info)))
{
if (info->info.initial || u->v0 != value0 || u->v1 != value1)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform2i, 1);
u->v0 = value0;
u->v1 = value1;
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set3i (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
int value0,
int value1,
int value2)
{
Uniform3i *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3I, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3I, 1, key, stamp, &info)))
{
if (info->info.initial || u->v0 != value0 || u->v1 != value1 || u->v2 != value2)
{
u->v0 = value0;
u->v1 = value1;
u->v2 = value2;
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set4i (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
int value0,
int value1,
int value3)
{
Uniform4i *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4I, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4I, 1, key, stamp, &info)))
{
if (info->info.initial || u->v0 != value0 || u->v1 != value1 || u->v2 != value2 || u->v3 != value3)
{
u->v1 = value1;
u->v2 = value2;
u->v3 = value3;
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set_rounded_rect (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
const GskRoundedRect *rounded_rect)
{
GskRoundedRect *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
g_assert (rounded_rect != NULL);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_ROUNDED_RECT, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_ROUNDED_RECT, 1, key, stamp, &info)))
{
if (info->info.initial || memcmp (u, rounded_rect, sizeof *u) != 0)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, GskRoundedRect, 1);
memcpy (u, rounded_rect, sizeof *rounded_rect);
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set_matrix (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
const graphene_matrix_t *matrix)
{
graphene_matrix_t *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
g_assert (matrix != NULL);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_MATRIX, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_MATRIX, 1, key, stamp, &info)))
{
if (info->info.initial || memcmp (u, matrix, sizeof *u) != 0)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, graphene_matrix_t, 1);
memcpy (u, matrix, sizeof *matrix);
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set_texture (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
guint texture_slot)
{
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
guint *u;
g_assert (texture_slot >= GL_TEXTURE0);
texture_slot -= GL_TEXTURE0;
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_TEXTURE, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_TEXTURE, 1, key, stamp, &info)))
{
if (info->info.initial || *u != texture_slot)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, guint, 1);
*u = texture_slot;
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set_color (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
const GdkRGBA *color)
{
static const GdkRGBA transparent = {0};
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
GdkRGBA *u;
g_assert (state != NULL);
g_assert (program != NULL);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_COLOR, 1, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_COLOR, 1, key, stamp, &info)))
{
if (color == NULL)
color = &transparent;
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, GdkRGBA, 1);
memcpy (u, color, sizeof *color);
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set1fv (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
guint count,
const float *value)
{
Uniform1f *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
g_assert (count > 0);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1FV, count, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1FV, count, key, stamp, &info)))
{
if (info->info.initial || count != info->info.array_count || memcmp (u, value, sizeof *u * count) != 0)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform1f, count);
memcpy (u, value, sizeof (Uniform1f) * count);
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set2fv (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
guint count,
const float *value)
{
Uniform2f *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
g_assert (count > 0);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2FV, count, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2FV, count, key, stamp, &info)))
{
if (info->info.initial || count != info->info.array_count || memcmp (u, value, sizeof *u * count) != 0)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform2f, count);
memcpy (u, value, sizeof (Uniform2f) * count);
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set3fv (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
guint count,
const float *value)
{
Uniform3f *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
g_assert (count > 0);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3FV, count, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3FV, count, key, stamp, &info)))
{
if (info->info.initial || count != info->info.array_count || memcmp (u, value, sizeof *u * count) != 0)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform3f, count);
memcpy (u, value, sizeof (Uniform3f) * count);
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}
static inline void
gsk_ngl_uniform_state_set4fv (GskNglUniformState *state,
GskNglUniformProgram *program,
- guint location,
+ guint key,
guint stamp,
guint count,
const float *value)
{
Uniform4f *u;
- GskNglUniformInfoElement *info;
+ GskNglUniformMapping *info;
g_assert (state != NULL);
g_assert (program != NULL);
g_assert (count > 0);
- if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4FV, count, location, stamp, &info)))
+ if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4FV, count, key, stamp, &info)))
{
if (info->info.initial || count != info->info.array_count || memcmp (u, value, sizeof *u * count) != 0)
{
GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform4f, count);
memcpy (u, value, sizeof (Uniform4f) * count);
- gsk_ngl_uniform_info_changed (info, location, stamp);
+ gsk_ngl_uniform_info_changed (info, stamp);
}
}
}